<?php

App::uses('Controller', 'Controller');
App::uses('Sesion', 'Model');

class AppController extends Controller {

    public $components = array(
        'DebugKit.Toolbar' => array('autoRun' => false),
        'Auth' => array(
            'loginRedirect' => array(
                'controller' => 'Index',
                'action' => 'index',
            ),
            'authorize' => array('Controller'),
            'authError' => 'No puede acceder a esta página o realizar esa acción debido a falta de permisos. Debe hablar con un Administrador para realizar esta operación',
            'sessionKey' => false
        ),
        "Session",
        'RequestHandler'
    );
    public $uses = array('Sesion', 'Usuario', 'UsuarioAdministrador', 'Reserva');

    /**
     * Acciones a ejecutar antes de aplicar el filtro del autenticador
     *
     * Metodo donde se especifican acciones a ejecutar antes de que se
     * aplique el filtro del autenticador
     *
     * @return void
     */
    public function beforeFilter() {
        if (!$this->request->query('debug') || $this->request->query('debug') !== 'true') {
            Configure::write('debug', 0);
        }
        $this->layout = "miBus-admin";
        if ($this->request->is("mobile")) {
            $this->set("mobile", true);
        } else {
            $this->set("mobile", false);
        }
        if (!in_array(strtolower($this->request->controller), array("tablet", "seo"))) {
            $this->Auth->authenticate = array(
                'Cas'
            );
            $this->Auth->loginAction = array(
                'controller' => 'Index',
                'action' => 'index',
            );

            $phpCAS = $this->Session->read('phpCAS');
            if (isset($phpCAS) || $phpCAS !== null) {
                if ($this->Session->read('loggedIn') !== FALSE) {
                    $this->Auth->loginAction = array("controller" => $this->request->controller, "action" => $this->request->action);
                } else {
                    $this->Session->write("loggedIn", TRUE);
                    $this->Sesion->create();
                    $this->Sesion->set(
                            array(
                                'id_usuario' => $phpCAS['attributes']['NumeroIdentificacion'],
                                'fecha_inicio_sesion' => date('Y/m/j H:i:s'),
                            )
                    );
                    $this->Sesion->save($this->Sesion->data, false);
                    $this->Session->write("SesionId", $this->Sesion->id);
                    $usuario = $this->Usuario->find('first', array(
                        'conditions' => array('Usuario.identificacion_usuario' => $phpCAS['attributes']['NumeroIdentificacion'])
                    ));
                    if (empty($usuario) || !$usuario) {
                        $this->Usuario->create();
                        $correo = $phpCAS['attributes']['CorreoElectronico'];
                        $corrArray = explode(";", $correo);
                        $this->Usuario->set(
                                array(
                                    'nombre_usuario' => $phpCAS['attributes']['NombreCompleto'],
                                    'telefono' => $phpCAS['attributes']['NumeroTelefono'],
                                    'correo' => $corrArray[(count($corrArray) - 1)],
                                    'celular' => $phpCAS['attributes']['NumeroCelular'],
                                    'fecha_creacion_usuario' => date('Y/m/j H:i:s'),
                                    'fecha_modificacion_usuario' => date('Y/m/j H:i:s'),
                                    'identificacion_usuario' => $phpCAS['attributes']['NumeroIdentificacion']
                                )
                        );
                        $usuario = $this->Usuario->data;
                        $this->Usuario->save($this->Usuario->data, false);
                    } else {
                        $correo = $phpCAS['attributes']['CorreoElectronico'];
                        $corrArray = explode(";", $correo);
                        $usuario['Usuario']['nombre_usuario'] = $phpCAS['attributes']['NombreCompleto'];
                        $usuario['Usuario']['telefono'] = $phpCAS['attributes']['NumeroTelefono'];
                        $usuario['Usuario']['correo'] = $corrArray[(count($corrArray) - 1)];
                        $usuario['Usuario']['celular'] = $phpCAS['attributes']['NumeroCelular'];
                        $usuario['Usuario']['fecha_modificacion_usuario'] = date('Y/m/j H:i:s');
                        $this->Usuario->save($usuario, false);
                    }

                    $reservas = $this->Reserva->find('all', array(
                        'conditions' => array('Reserva.estado_reserva' => 'programada', 'Reserva.id_usuario' => $phpCAS['attributes']['NumeroIdentificacion']),
                        'recursive' => 1
                    ));
                    foreach ($reservas as $res) {
                        $fecha_salida = date('Y-m-d', strtotime($res['RecorridoRealizado']['fecha_salida']));
                        $today = date('Y/m/j H:i:s');
                        $todayDT = new DateTime($today);
                        $fecha_salidaDT = new DateTime($fecha_salida);
                        $diff = $todayDT->diff($fecha_salidaDT);
                        $day_diff = $diff->format('%r%d');
                        if (intval($day_diff) <= intval(-1)) {
                            $res['Reserva']['estado_reserva'] = 'cancelada';
                            $this->Reserva->save($res, false);
                        }
                    }

                    if (!$this->request->is("mobile")) {
                        $ua = $this->UsuarioAdministrador->find('first', array(
                            'conditions' => array('UsuarioAdministrador.id_usuario' => $phpCAS['attributes']['NumeroIdentificacion'])
                        ));

                        if (!empty($ua)) {
                            $this->Session->write("admin", $usuario);
                            $ua['UsuarioAdministrador']['fecha_ultimo_inicio_sesion'] = date('Y/m/j H:i:s');
                            $this->UsuarioAdministrador->save($ua, false);
                        }
                    }

                    return $this->redirect($this->Auth->loginRedirect);
                }
                $this->Auth->allow($this->request->action);
            } else {
                $this->Session->write("loggedIn", FALSE);
            }
        } else if (strtolower($this->request->controller) == "seo") {

        } else {
            $this->Auth->loginAction = array(
                'controller' => 'Tablet',
                'action' => 'login',
            );
            $this->Auth->authenticate = array(
                'Mobile'
            );
        }

        $admin = $this->Session->read("admin");
        if (!isset($admin)) {
            if (!in_array(strtoupper($this->request->controller), array("INDEX", "RESERVAS", "LOGIN", "TABLET", "RECORRIDOS", "RUTAS", "CONTACTENOS", "PREDICCIONES", "SEO"))) {
                $this->redirect(array('controller' => 'Index',
                    'action' => 'index',
                ));
            } else {
                if (strtoupper($this->request->controller) == "INDEX") {
                    if (strtoupper($this->request->action) == "ADMINISTRAR") {
                        $this->redirect(array('controller' => 'Index',
                            'action' => 'index',
                        ));
                    }
                } else {
                    if (strtoupper($this->request->controller) == "RESERVAS") {
                        if (!in_array(strtoupper($this->request->action), array("AGREGAR_AJAX", "BORRAR", "EDITAR"))) {
                            $this->redirect(array('controller' => 'Index',
                                'action' => 'index',
                            ));
                        }
                    }
                    if (strtoupper($this->request->controller) == "RECORRIDOS") {
                        if (!in_array(strtoupper($this->request->action), array("RECORRIDOS_POR_RUTA"))) {
                            $this->redirect(array('controller' => 'Index',
                                'action' => 'index',
                            ));
                        }
                    }
                    if (strtoupper($this->request->controller) == "RUTAS") {
                        if (!in_array(strtoupper($this->request->action), array("PARADAS_POR_RUTA"))) {
                            $this->redirect(array('controller' => 'Index',
                                'action' => 'index',
                            ));
                        }
                    }
                    if (strtoupper($this->request->controller) == "CONTACTENOS") {
                        if (!in_array(strtoupper($this->request->action), array("CONTACTO"))) {
                            $this->redirect(array('controller' => 'Index',
                                'action' => 'index',
                            ));
                        }
                    }
                    if (strtoupper($this->request->controller) == "PREDICCIONES") {
                        if (!in_array(strtoupper($this->request->action), array("PREDICCIONES_DATA"))) {
                            $this->redirect(array('controller' => 'Index',
                                'action' => 'index',
                            ));
                        }
                    }
                }
            }
        }
    }

    public function isAuthorized($usuario) {
        return TRUE;
    }

}
